<?php

namespace app\adminapi\controller;

use app\common\model\Admin;
use think\Controller;
use tools\jwt\Token;

class Login extends BaseApi
{
    /**
     * 生成验证码
     *
     * 本函数用于生成一个唯一的验证码标识，并将其与验证码图片的URL一起返回给客户端
     * 验证码的唯一标识用于后端验证用户提交的验证码是否正确
     */
    public function captcha()
    {
        // 生成一个唯一的标识符，确保每个验证码都是不同的
        $uniqid = uniqid(mt_rand(100000, 999999));

        // 准备返回的数据，包括验证码图片的URL和唯一的标识符
        $data = [
            'src' => captcha_src($uniqid),
            'uniqid' => $uniqid
        ];

        // 使用自定义的ok方法返回验证码数据
        $this->ok($data);
    }

    /**
     * 用户登录方法
     *
     * 此方法用于处理用户登录请求，包括验证输入参数、检查验证码、验证用户凭据以及生成登录后的用户信息
     */
    public function login()
    {
        // 获取用户输入的所有参数
        $param = input();

        // 对用户输入的参数进行验证，确保包含用户名、密码、验证码和唯一标识
        $validate = $this->validate($param, [
            'username|用户名' => 'require',
            'password|密码' => 'require',
            'code|验证码' => 'require',
            'uniqid|唯一标识' => 'require'
        ]);

        // 如果验证失败，则返回验证错误信息
        if ($validate !== true) {
            $this->fail($validate);
        }

        // 设置当前会话ID为缓存中保存的会话ID
        $session_id = cache('session_id_' . $param['uniqid']);
        if ($session_id) {
            session_id($session_id);
        }

        // 验证用户输入的验证码是否正确
        if (!captcha_check($param['code'], $param['uniqid'])) {
            //TODO 暂时注释掉验证码校验，用于后续其他接口测试
//            $this->fail('验证码错误');
        }

        // 构造查询条件，验证用户名和加密后的密码是否匹配
        $where = [
            'username' => $param['username'],
            'password' => encrypt_password($param['password'])
        ];

        // 执行用户查询，如果查询结果为空，则返回登录失败信息
        $info = Admin::where($where)->find();
        if (!$info) {
            $this->fail('用户名或密码错误');
        }

        // 生成用户登录成功后的信息，包括token、用户ID、用户名、昵称和邮箱
        $data['token'] = Token::getToken($info['id']);
        $data['user_id'] = $info['id'];
        $data['username'] = $info['username'];
        $data['nickname'] = $info['nickname'];
        $data['email'] = $info['email'];

        // 返回登录成功信息
        $this->ok($data);
    }

    /**
     * 执行用户登出操作
     *
     * 本函数通过获取当前请求的令牌，并将其添加到缓存的删除令牌列表中，
     * 以实现用户登出的功能，确保令牌在一天内不再有效
     */
    public function logout()
    {
        // 获取当前请求的令牌
        $token = Token::getRequestToken();

        // 从缓存中获取已删除的令牌列表，如果不存在则初始化为空数组
        $delete_token = cache('delete_token') ?: [];

        // 将当前令牌添加到删除列表中
        $delete_token[] = $token;

        // 将更新后的删除令牌列表缓存，有效期设为一天（86400秒）
        cache('delete_token', $delete_token, 86400);

        $this->ok();
    }
}
